iT邦幫忙

DAY 14
3

程式設計心法系列 第 14

程式設計心法:13.變數命名--使用變數的注意事項

  • 分享至 

  • xImage
  •  

變數命名重不重要呢?如果您的程式不斷地在更新,程式不斷的擴展,甚至於是一個系統,這就很重要了,因為不是您一個人可以完成的事情,就必須要考慮到別人是否看得懂,容易了解您的程式。

今天這篇,就提到一些使用變數該注意的事項,不囉嗦了,馬上進入主題。
.變數的作用範圍(Scope)
寫程式常會遇到的問題,就是這個變數要宣告在哪個位置?是全域?還是使用區域變數?
若使用全域變數,寫程式的時候,很方便,任何地方都看得到它,可是這樣一來,也會面臨到是否全域變數的值的改變,影響到程式的正常運作(這是常發生的事!)。可是如果為了怕全域變數會出錯,不知道在哪邊改了它的值,所以乾脆都使用區域變數,那麼您又得不斷的用參數來傳遞所需要的資料,這確實是會令人困擾。

幾個好的建議是,盡量縮小變數的作用範圍,非必要不使用全域變數,如果全域變數具有具名常數的意義,或是用來儲存整體狀態的(如:Session)那麼使用全域變數就會比較合適。

另外就是將相關性的變數的使用,放在集中的區塊,這樣在尋找變數上會節省時間,也可以較好辨認。
例如:

Dim myStr1 as String, myStr2 as String
Dim myInt1 as Integer, myInt2 as Integer

SetMyStr(myStr1)
SetMyStr(myStr2)

SetMyInt(myInt1)
SetMyInt(myInt2)

.持續性(Persistence)
持續性這個東西,最常見的就是物件的有效性,也是最常會發生錯誤的地方(如:NullPointException),而以前寫 ADO 程式的時候,最常忘記的就是 Connection 沒有 Release,或 Recordset 沒有 Initialize,或已經 Closed 還對他做存取。(這部份我們在 Error Handling 單元再說明)。
使用物件的好習慣,就是在不需要他的時候,就將他 Release 出來
如:

myRecordset=Nothing
myConnection=Nothing

GC.Collect()

.變數的連結時間(Binding Time)
這個跟 Early Binding 或 Late Binding 沒關係,指得是變數與變數的值真正聯繫在一起的時間。(Early Binding, Late Binding 指得是物件參考的方式,想要在開發/編譯的過程中就能參考物件的內容,要使用 Early Binding,如果要在 Run Time 的時候動態產生物件,就可以使用 Late Binding 的方式來產生物件,請參考http://wiki.answers.com/Q/What_is_the_difference_between_Late_binding_and_early_binding

這個部分,主要是要說明,變數連結的時間愈晚,撰寫程式的彈性就愈大。跟前面魔術數字的概念類似,當我們直接指定變數的值的時候,在 Compiler 時間就已經決定變數的內容了,如果是採用變數指定的方式,則在 Run Time 才會將變數與變數值連結在一起,但也要注意錯誤的控制,因為可能會有沒想到的問題發生。

.將變數的存取集中化
比較好的習慣是在模組中,將所需的變數做初始化,或透過常是的方式存取變數。
通常我會使用 init() 來設定變數的初始值,這樣的好處是,我的程式碼寫一次,就可以讓很多模組共用,這樣也不會漏掉或者是上一次執行的結果可能還保留在變數中,而導致執行該模組的時候,發生錯誤。

Dim a as String, b as String
Dim i as Integer, j as Integer

Sub init()
  a=""
  b=""

  i=0
  j=0
End Sub

本系列文章


上一篇
程式設計心法:12.變數命名--匈牙利命名法
下一篇
程式設計心法:14.流程控制--if & case
系列文
程式設計心法31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2009-10-20 09:50:15

"使用物件的好習慣,就是在不需要他的時候,就將他 Release 出來"

因為我比較懶
所以我覺得這應該是程式語言自己要處理的
而不是需要我們主動去提醒的 ^_^

0
fillano
iT邦超人 1 級 ‧ 2009-10-20 10:57:31

如果是寫C,大概沒辦法讓程式語言自己處理,不過這也許可以用framework來解決。之前寫過php extension,註冊資源時要同時註冊destructor來負責清除,所有它內建的type大概都會做紀錄,然後在適合的life cycle stage做處理。這樣就比較不容易出問題。

在Java裡面的話,通常像db connection這樣的資源,會利用pool來管理(有很多db connection pool的lib可以用),程式裡面只需要跟他要資源,這樣就不用煩惱了。

以Java來說,雖然有GC替我們管理,但是程式沒寫好還是會造成memory leak(與OS無關),最後把VM的記憶體吃光,這不是萬能的阿。Javascirpt也會做GC或是用object count來管理,但是狀況跟java一樣,沒寫好的話...我以前也寫壞過東西,放著讓它跑,結果Firefox吃掉五六百MB的記憶體...

我要留言

立即登入留言